iT邦幫忙

2021 iThome 鐵人賽

DAY 19
2

今天開始做我們的 Telegram Bot!

Telegram

Telegram 是一個通訊軟體,就像是 Messenger 或 Line 一樣,只不過它更加的「開放」,你甚至可以自己寫一個喜歡的介面。

他的 API 文件非常完整,我們在寫 Bot 的時候應該會常常需要用到,先在這裡提供個連結

Cloudflare Workers

Cloudflare Workers 是 Cloudflare 提供的一個 Serverless 運算服務,免費方案的上限是一天 100,000 個請求,對我們自用的 Bot 非常夠用。

限制

在使用前,我們需要先了解一下免費方案的一些相關限制。

  • 單一 Script 的大小限制是 1 MB
  • 一次執行的時間上限是 10 ms
  • 一次執行的發送請求數最多為 50 個

第一個限制代表你不能將整個 JSDOM 這種大 Package 包起來丟上去。
第二個限制代表你程式不能寫太複雜的運算,像是大量文字比對或是圖片處理之類的。
第三個請求應該跟我們要做的關係比較不大,但還是提醒一下,如果你要做合併很多資料來源的事,要小心不要超過 50 個。

我在這裡推測你都先註冊好 Cloudflare 帳號了,那就讓我們開始吧!

用途

我認為 Cloudflare Workers 的用途很廣,這裡列出幾個例子:

  • Reverse Proxy
  • API on Edge
  • Website Uptime Checker
  • Chat Bot Client
  • 刷流量

你可以將 Reverse Prooxy 的邏輯寫在 Cloudflare Workers 上,把它當 Load Balancer 之類的東西。
也可以把它當成 API 或定時向網站傳請求確認狀態,當然也可以用來做 Chat Bot。
除此之外,因為 1 - 50 請求的比例,所以也可以當放大器,且請求是由 Cloudflare 在各地的節點送出,分散位置。不過因為 Cloudflare 為了安全因素有限制每分鐘請求數,所以基本上不太可能成為攻擊的工具,不過用來說流量不用那麼大量請求,就像是昨天的文章觀看數,我用四五行程式 + Cron 5 mins 持續 8 小時就變這樣了。

起手式

首先,我們一樣需要再建立一個新的專案資料夾,這次就叫它 bot 好了。

接著, 安裝 Wrangler 至全域環境:

npm i -g @cloudflare/wrangler

然後在 bot 資料夾中執行:

wrangler init

Wrangler 就會幫你生成好初始的 wrangler.toml 了:

name = "bot"
type = "webpack"
route = ''
zone_id = ''
usage_model = ''
compatibility_flags = []
workers_dev = true
compatibility_date = "2021-10-03"

這個檔案就是 Cloudflare Workers 的專案設定檔,之後 publish 到 Edge 時就會用到它的設定。

接著,因為我們之後會用到 webpack 來打包,所以還需要建立一個設定檔 webpack.config.js:

module.exports = {
    context: __dirname,
    entry: "./index.js",
    mode: "production",
    target: "webworker",
    optimization: {
        minimize: true,
    },
};

再來,因為我們也還是要用 NPM 做開發,所以還是要:

npm init -y

來初始或我們專案 npm 管理的部分。

接著,安裝我們會需要用到的開發套件:

npm i -D @cloudflare/wrangler webpack webpack-cli

中間的 -D 代表的是這些套件是開發時要用的,並不是「產品」的一部分。

以及:

npm i itty-router

這個是「產品」的一部分,所以不用加 -D

然後建立一個 src 子資料夾,並在其中新增一個 main.js:

import { Router } from "itty-router";

const router = Router();

router.all("*", async (request) => {
    const { query, headers } = request;
    return response({ data: JSON.stringify({ ...request }, null, query.min ? 0 : 2) });
});

async function main() {
    addEventListener("fetch", (event) => {
        event.respondWith(router.handle(event.request));
    });
}

export { main };

並在專案資料夾中建立 index.js:

import { main } from "./src/main.js";

main();

來引用並執行 main 來監聽訊息傳入。

與之前使用的 require 不同,我們在這裡就用到 ESM 的 import 以及 export 了。

這樣專案大致就建置完成了,明天就該來想點重要的部分囉。


每日鐵人賽熱門 Top 10 (1002)

以 10/02 20:00 ~ 10/03 20:00 文章觀看數增加值排名

  1. +1337 #18 用免費 Serverless 及 JavaScript 寫 Telegram 聊天機器人!
    • 作者: JacobLinCool
    • 系列:JavaScript Easy Go!
  2. +242 JS 07 - 原型方法:欲達則必速
    • 作者: Felix
    • 系列:JavaScript 從 50% 開始,打造函式庫不是問題!
  3. +141 D19 - 「吶,你想要成為什麼顏色?」:打造一個調色盤吧!
    • 作者: 鱈魚
    • 系列:你渴望連結嗎?將 Web 與硬體連上線吧!
  4. +126 # 18 數據上的各種距離(3)
    • 作者: 新增資料夾9
    • 系列:終極大數據地獄
  5. +124 Proxmox VE 掛接網路儲存 (二)
    • 作者: Jason Cheng (節省哥)
    • 系列:突破困境:企業開源虛擬化管理平台
  6. +112 Day 1 無限手套 AWS 版:掌控一切的 5 + 1 雲端必學主題
    • 作者: 用圖片高效學程式
    • 系列:無限手套 AWS 版:掌控一切的 5 + 1 雲端必學主題
  7. +107 [區塊鏈&DAPP介紹 Day25] Dapp 實戰 投票系統 - 1
    • 作者: syhlion
    • 系列:區塊鏈&DAPP介紹
  8. +102 DAY 18 製作 Nav Bar - dropdown
    • 作者: Tilda
    • 系列:SASS 基礎初學三十天
  9. +102 Day20 - 用 Ruby on Rails 抓臺灣證券交易所資料-每日收盤行情
    • 作者: 小菜
    • 系列:Ruby on Rails 與它們相關的東西 II
  10. +99 Day18 Let's ODOO: Paper Format
    • 作者: 蓋瑞
    • 系列:Let's ODOO 開發與應用30天挑戰

看吧,Cloudflare Workers 可以用來刷流量


上一篇
#18 用免費 Serverless 及 JavaScript 寫 Telegram 聊天機器人!
下一篇
#20 Telegram Bot Webhook 訊息收發
系列文
JavaScript Easy Go!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言